Jak przesyłać pliki na różne strony PrestaShop-Najważniejsze pytania i odpowiedzi dotyczące programowania

Posted On: Sep 14, 2018

Categories:

Tags: przesyłanie plików , przesyłanie multimediów

PrestaShop to najprostszy koszyk zakupowy, który pasuje do małych firm. Jeśli chcesz otworzyć nowy sklep, PrestaShop powinien być Twoim pierwszym wyborem. Powodem jest to, że jest to w pełni open source i można go modyfikować według własnego wyboru.

Temat, który wybraliśmy dzisiaj na sesję pytań i odpowiedzi, to zasadniczo zaawansowana funkcjonalność PrestaShop, a mianowicie Przesyłanie plików opcja na różnych stronach PrestaShop. Jako sprzedawca czasami musisz uzyskać pliki od klientów w formie PDF, Excel, wideo, MP3, JPEG lub dowolnego innego formatu pliku. Nie jest lepiej mieć zewnętrzne serwery chmurowe do pobierania plików.

Dlaczego nie zrobić tego za pomocą własnego serwera sklepu?

Podobnie, czasami musisz wysłać plik do swoich klientów, można to zrobić za pośrednictwem samego PrestaShop, co eliminuje potrzebę korzystania z usług zewnętrznych.

Dzisiejszy post ma na celu to samo. Podczas korzystania z tej funkcji ludzie otrzymują pewne błędy lub usterki i szukają dla nich rozwiązania. Dzisiaj staraliśmy się podać wszystkie możliwe rozwiązania takich problemów. Oto najważniejsze pytania i odpowiedzi dotyczące programowania dotyczące opcji przesyłania plików w PrestaShop;

Pytanie nr 1

Cześć, chcę wyłączyć opcję przesyłania w formularzu kontaktowym, aby nikt nie mógł mi przesyłać plików za pomocą tej opcji?

Odpowiedź: Możesz dezaktywować tę opcję w zapleczu. Przejdź do sekcji klienci>Obsługa klienta. Gdzie możesz włączyć lub wyłączyć opcję według własnego wyboru.

Pytanie nr 2

Cześć, chcę utworzyć pole wprowadzania danych w formularzu rejestracji klienta. Za pośrednictwem tych pól odwiedzający muszą przesłać plik zawierający dowód, że mają prawo dostępu do sklepu. Chcę sprawdzić ten dowód, a następnie zezwolić na jego rejestrację. Jak to jest możliwe?

Odpowiedź: Musisz zmodyfikować formularz rejestracyjny. Możesz uzyskać dostęp do formularza rejestracyjnego za pośrednictwem ./themes/YOUR-THEME/authentication.tpl. Zaraz po polu daty urodzenia, w okolicach wiersza 130, musisz dodać to;

<divclass="form-group">

    <labelfor="fileUpload">{l s='Wybierz plik'} *

    <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>

<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>

Możesz dodać pole w klasie klienta i kontrolerach (AdminCustomersController.php, AuthController.php, Customer.php).

Przede wszystkim nazwij pole „fileupload”, za pomocą którego deklarujesz i tworzysz pole. Uruchommy to polecenie w SQL, aby utworzyć pole w tabeli customer do przechowywania nazwy pliku.

ALTERTABLE`ps_customer`ADD`fileUpload` VARCHAR(100)NOTNULL;

W ./classes/Customer.php około wiersza ~30 znajdziemy zadeklarowane zmienne. Dodaj nowe pole w następujący sposób:

classCustomerCoreextendsObjectModel

{

public $id;

public $fileUpload;

public $id_shop;

...

następnie w wierszu ~192 dodaj nowe pole w następujący sposób:

'date_add'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),

'date_upd'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),

'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),

),

Teraz, wewnątrz ./controllers/front/AuthController.php w okolicach linii ~379, wstępniesparuj informacje:

// Przygotowanie klienta

$customer =newCustomer();

$lastnameAddress =Tools::getValue('lastname');

$firstnameAddress =Tools::getValue('firstname');

$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);

$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);

// Dodaj to linia

$fileUpload =Tools::getValue('fileUpload');

wokół linii ~423 znajdziesz walidację urodzin, więc musisz utworzyć pole walidacji.

$customer->firstname =Tools::ucwords($customer->firstname);

$customer->urodziny =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));

if(!Validate::isBirthDate($customer->birthday))

    $this->errors[]=Tools::displayError('Nieprawidłowa data urodzenia.');

// Dodaj ten kod...

//$customer->fileUpload = 'N/A';

// Jeśli chcesz, aby uploader był OPCJONALNIE, usuń komentarz z powyższego wiersza.

$file = $_FILES['fileUpload'];

$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');

$extension = pathinfo($file['name'], PATHINFO_EXTENSION);

if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))

{

$filename = uniqid()."-".basename($file['name']);

$filename = str_replace(' ','-', $filename);

$filename = strtolower($filename);

$filename = filter_var($filename, FILTER_SANITIZE_STRING);

$file['name']= $filename;

$uploader =newUploaderCore();

$uploader->upload($file);

$customer->fileUpload = $filename;

W ten sam sposób w wierszu ~552, pozostawiając go w ten sposób:

$customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));

if(!Validate::isBirthDate($customer->birthday))

               $this->errors[]=Tools::displayError('Nieprawidłowa data birth');

// Dodaj ten kod...

//$customer->fileUpload = 'N/A';

// Jeśli chcesz, aby uploader był OPCJONALNY, usuń komentarz z wiersza powyżej.

$file = $_FILES['fileUpload'];

$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');

$extension = pathinfo($file['name'], PATHINFO_EXTENSION);

if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))

{

$filename = uniqid()."-".basename($file['name']);

$filename = str_replace(' ','-', $filename);

$filename = strtolower($filename);

$filename = filter_var($filename, FILTER_SANITIZE_STRING);

$file['name']= $filename;

$uploader =newUploaderCore();

$uploader->upload($file);

$customer->fileUpload = $filename;

W ten sposób pliki zostaną przesłane do folderu ./upload/, jeśli chcesz określić inny podfolder, po prostu wstaw ścieżkę w $uploader->upload('my-path/'.$_FILES['fileUpload']);

Aby dodać pola wejściowe w formularzu rejestracyjnym otwórz ./themes/YOUR-THEME/authentication.tpl około ~182 i ~509 zaraz po polach urodzin.

<divclass="form-group">

    <labelfor="fileUpload">{l s='Wybierz plik'} *

    <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>

    <inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>

Nie zapomnij skonfigurować formularza tak, aby wysyłał informacje multimedialne na każdym tagu, jak w poniższym kodzie: (zależy od motywu)

<formmethod="post"id="create-account_form" ... enctype="multipart/form-data">

Aby wyświetlić nazwę pliku na liście klientów, otwórz./controllers/admin/AdminCustomersController.php około wiersza ~159 i dodaj:

'connect'=> array(

        'title'=> $this->l('Ostatnia wizyta'),

        'type'=>'datetime',

        'search'=>false,

        'havingFilter'=>true

),

'fileUpload'=> array(

        'title'=> $this->l('Przesłany plik'),

        'type'=>'text',

        'search'=>true,

        'havingFilter'=>true

)

));

W tym samym pliku, około ~821:

// Połączenia

'connections'=> $connections,

// Przesłany plik

'fileUpload'=> $fileUpload,

// Odsyłacze

'referrers'=> $referrers,

'show_toolbar'=>true

Wyczyść pamięć podręczną po zaktualizowaniu plików. Jeśli chcesz wyświetlić pliki w widoku klienta, musisz zmodyfikować ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl. i umieścić ten kod tuż po walidacji $customer->birthday w wierszach ~550 i ~420, aby uruchomić program do przesyłania w AuthController.php

if(isset($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['tmp_name']))

{

      $extension = array('.txt','.rtf','.doc','.docx','.pdf','.png','.jpeg','.gif','.jpg');

      $filename = uniqid().basename($_FILES['fileUpload']['name']);

      $filename = str_replace(' ','-', $filename);

      $filename = strtolower($filename);

      $filename = filter_var($filename, FILTER_SANITIZE_STRING);

      $_FILES['fileUpload']['name']= $filename;

      $uploader =newUploaderCore();

      $uploader->upload($_FILES['fileUpload']);

      $customer->fileUpload = $filename;

Pytanie nr 3: Cześć, chcę, aby informacje o zamówieniu były drukowane na jednej stronie i powinienem mieć możliwość wyboru, która część ma się pojawić na stronie wydruku, a który materiał nie. Domyślnie drukuje się na 3 stronach, co jest trochę bezużyteczne.

Odpowiedź: Przejdź do override.css w /admin/themes/default/css/override.css, skąd możesz zmienić styl drukowania według potrzeb. 

@media print {

 p {text-indent: 10%

Musisz dostosować akcję css "display:none" z zakładką Paypal i innymi zakładkami.

Pytanie nr 4

Używam PrestaShop 1.6 i chcę skorzystać z import.csv. Zaimportowaliśmy obrazy i tekst, a opcję przesyłania pliku ustawiliśmy na 1. Teraz poprowadź mnie, jak przesłać i dołączyć plik PDF jako arkusz danych z produktami.

Odpowiedź: Więc w AdminImportController.php dodaj te dwa wiersze na liście pól dla importu produktów (case $this->entities[$this->l('Products')])

'delete_existing_attachments'=> array('label'=> $this->l('Usuń istniejące załączniki (0 = Nie, 1 = Tak)')),

'attachment'=> array('label'=> $this->l('attachment')),

Następnie na końcu funkcji productImport(), po tych wierszach:

else{

                       StockAvailable::setQuantity((int)$product->id,0,(int)$product->quantity,(int)$this->context->shop->id);

                   

                 };

dodaj to:

 // Importowanie plików załączników     

        //usuń istniejące załączniki, jeśli „delete_existing_attachments” jest ustawione na 1

            if(isset($product->delete_existing_attachments))

                    if((bool)$product->usuń_istniejące_załączniki)

                        $product->usuńZałączniki();               

                $attachments = get_object_vars($product);

  if(isset($attachments['attachment'])&&!empty($attachments['attachment']))

                    foreach(explode($this->multiple_value_separator, $attachments['attachment'])as $single_attachment)

                                       

                        $tab_attachment = explode('|', $single_attachment);

                        $attachment_filename = isset($tab_attachment[0])? $tab_attachment[0]:'';

                        $attachment_name = isset($tab_attachment[1])? trim($tab_attachment[1]): $attachment_filename ;

                        $attachment_description = isset($tab_attachment[2])? trim($tab_attachment[2]):'';

                        if(!empty($attachment_filename))

                            

                            $id_attachment =(int)Attachment::addAttachmentImport($attachment_filename, $attachment_name, $attachment_description);

                          Attachment::addAttchmentProductImport($product->id, $id_attachment);

                            Product::updateCacheAttachment($product->id);

                            

                    

                    

 

 

 W pliku klasy załącznika (classes/Attachment.php) dodaj na końcu te dwie funkcje:

        publicstaticfunction addAttachmentImport($filename, $name, $description)

    {

            $attachment =newAttachment();

            

            $languages ​​=Language::getLanguages();

            foreach($languages ​​as $language)

            $attachment->name[$language['id_lang']]= strval($name);

            $attachment->description[$language['id_lang']]= $description;

 

            $attachment->file = sha1($filename);

            $attachment->file_name = $filename;

            

            $path_file = _PS_DOWNLOAD_DIR_.$filename;

            $attachment->file_size = filesize($path_file);

            $finfo = finfo_open(FILEINFO_MIME_TYPE);

            $attachment->mime = finfo_file($finfo, $path_file);

            $attachment->addAttachment();

            return(int)$attachment->id;        

       

    publicstaticfunction addAttchmentProductImport($id_product, $id_attachment)

    {

        returnDb::getInstance()->execute('

            INSERT INTO `'._DB_PREFIX_.'product_attachment` (`id_attachment`, `id_product`)

            VALUES ('.(int)$id_attachment.', '.(int)$id_product.')

        ');

    

usuń plik pamięci podręcznej: /cache/class_index.php Musisz umieścić swoje pliki w folderze /Download. W pliku cvs kolumna „attachment” może zawierać to:

myfile1.doc|Nazwa mojego pliku Lub jeśli chcesz dołączyć kilka plików do jednego produktu:

myfile1.doc|Nazwa mojego pliku%myfile2.pdf| Nazwa mojego pliku

Pytanie nr 5

Czy istnieje sposób, aby zmusić odwiedzających do przesyłania dokumentów firmowych na stronie rejestracyjnej. Podczas wyszukiwania w internecie znalazłem takie moduły przesyłania, które umożliwiają przesyłanie na stronie zamówienia, produktu i koszyka, ale jak to zrobić na stronie rejestracyjnej?

Odpowiedź: Niestety, istnieje już dostępny moduł do tego celu. Musisz więc wykonać podstawową modyfikację lub napisać własny moduł. Jeśli jednak nie jesteś ekspertem od kodowania, skontaktuj się z jakąś firmą zajmującą się tworzeniem modułów.

Uwaga: Na te pytania odpowiadają najlepsi programiści społeczności i nie odzwierciedlają one modułów FME.

Opcja przesyłania plików w WooCommerce:

File Uploader dla WooCommerce umożliwia klientom przesyłanie plików bezpośrednio na strony produktów, koszyka i płatności, co usprawnia dostosowywanie i zarządzanie zamówieniami.